package agentes09.gestor;

import jade.core.AID;
import java.security.InvalidParameterException;
import java.util.Map;
import java.util.TreeMap;

/**
 * Esta clase representa la situacion del juego en un momento dado: cuanto dinero
 * tiene cada agente, cuanta mercancia, y donde se encuentra
 * @author jmcarmona
 */
public class SituacionJuego {

    private long tiempoSimulacion;
    private Map<AID, EstadoAgente> situacionProductores;
    private Map<AID, EstadoAgente> situacionConsumidores;
    private Map<AID, EstadoAgente> situacionCamiones;
    private Map<AID, EstadoAgente> situacionGasolineras;

    public SituacionJuego(long tiempoSimulacion) {
        this.tiempoSimulacion = tiempoSimulacion;
        situacionCamiones = new TreeMap<AID, EstadoAgente>();
        situacionConsumidores = new TreeMap<AID, EstadoAgente>();
        situacionGasolineras = new TreeMap<AID, EstadoAgente>();
        situacionProductores = new TreeMap<AID, EstadoAgente>();
    }

    public Map<AID, EstadoAgente> getSituacionCamiones() {
        return situacionCamiones;
    }

    public void setSituacionCamiones(Map<AID, EstadoAgente> situacionCamiones) {
        this.situacionCamiones = situacionCamiones;
    }

    public Map<AID, EstadoAgente> getSituacionConsumidores() {
        return situacionConsumidores;
    }

    public void setSituacionConsumidores(Map<AID, EstadoAgente> situacionConsumidores) {
        this.situacionConsumidores = situacionConsumidores;
    }

    public Map<AID, EstadoAgente> getSituacionGasolineras() {
        return situacionGasolineras;
    }

    public void setSituacionGasolineras(Map<AID, EstadoAgente> situacionGasolineras) {
        this.situacionGasolineras = situacionGasolineras;
    }

    public Map<AID, EstadoAgente> getSituacionProductores() {
        return situacionProductores;
    }

    public void setSituacionProductores(Map<AID, EstadoAgente> situacionProductores) {
        this.situacionProductores = situacionProductores;
    }

    public long getTiempoSimulacion() {
        return tiempoSimulacion;
    }

    public void setTiempoSimulacion(long tiempoSimulacion) {
        this.tiempoSimulacion = tiempoSimulacion;
    }

    /**
     * Este metodo anyade los datos actuales de un agente. Para ello, se mira que tipo de agente es,
     * y se insertan los datos en el mapa de registros correspondiente
     * @param idAgente El AID del agente.
     * @param tipoAgente El tipo del agente. Puede ser camion, consumidor, productor, o gasolinera ,
     * en minuscula o mayuscula
     * @param reg El registro de datos correspondiente
     * @throws InvalidParameterException si el tipoDeAgente no es alguno de los dados, o si
     * algun parametro es nulo
     */
    public void anyadirRegistro(AID idAgente, String tipoAgente, EstadoAgente reg)
            throws InvalidParameterException {
        if (idAgente == null) {
            throw new InvalidParameterException("El id de agente pasado es nulo");
        }
        if (reg == null) {
            throw new InvalidParameterException("El registro de simulacion pasado es nulo");
        }
        String tipoAgenteMinuscula = tipoAgente.toLowerCase();
        Map mapaCorrespondiente = null;
        if (tipoAgenteMinuscula.equals("camion")) {
            mapaCorrespondiente = situacionCamiones;
        } else if (tipoAgenteMinuscula.equals("consumidor")) {
            mapaCorrespondiente = situacionConsumidores;
        } else if (tipoAgenteMinuscula.equals("productor")) {
            mapaCorrespondiente = situacionProductores;
        } else if (tipoAgenteMinuscula.equals("gasolinera")) {
            mapaCorrespondiente = situacionGasolineras;
        } else {
            throw new InvalidParameterException("El tipo de agente pasado (" + tipoAgente + ") no es valido. " +
                    "Deberia ser camion, consumidor, productor o gasolinera.");
        }

        mapaCorrespondiente.put(idAgente, reg);
    }

    public String imprimirSituacionDelJuego() {
        String res = "Situacion del juego a las " + getTiempoSimulacion();

        return res;
    }

    @Override
    public String toString() {
        return imprimirSituacionDelJuego();
    }
}
